package org.jeecg.modules.online.cgform.service;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;
import org.hibernate.HibernateException;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.online.cgform.entity.OnlCgformButton;
import org.jeecg.modules.online.cgform.entity.OnlCgformEnhanceJava;
import org.jeecg.modules.online.cgform.entity.OnlCgformEnhanceJs;
import org.jeecg.modules.online.cgform.entity.OnlCgformEnhanceSql;
import org.jeecg.modules.online.cgform.entity.OnlCgformHead;
import org.jeecg.modules.online.cgform.model.OnlCgformModel;
import org.jeecg.modules.online.cgform.model.OnlGenerateModel;
import org.jeecg.modules.online.config.exception.BusinessException;
import org.jeecg.modules.online.config.exception.DBException;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.extension.service.IService;

import freemarker.template.TemplateException;

/**
 * @Description: Online表单开发
 * @Author: jeecg-boot
 * @Date: 2019-03-12
 * @Version: V1.0
 */
public interface IOnlCgformHeadService extends IService<OnlCgformHead> {

	/**
	 * 添加所有
	 * 
	 * @param model
	 * @return
	 */
	Result<?> addAll(OnlCgformModel model);

	/**
	 * 修改所有，包括新增、修改、删除
	 * 
	 * @param model
	 * @return
	 */
	Result<?> editAll(OnlCgformModel model);
	
	/**
	 * 同步数据库
	 */
	public void doDbSynch(String code,String synMethod) throws HibernateException, IOException, TemplateException, SQLException, DBException;
	
	/**
	 * 删除表和删除配置信息
	 * @param id
	 * @throws DBException
	 * @throws SQLException
	 */
	public void deleteRecordAndTable(String id) throws DBException,SQLException ;

	/**
	 * 删除表记录
	 * @param id
	 * @throws DBException
	 * @throws SQLException
	 */
	public void deleteRecord(String id) throws DBException,SQLException ;
	
	/**
	 * 根据SQL查询集合
	 * @param sql
	 * @return
	 */
	public List<Map<String,Object>> queryListData(String sql);
	
	
	/**
	 * 根据主表ID和JS增强类型查询实体
	 * @param code OnlCgformHead的id
	 * @param type JS增强类型
	 * @return
	 */
	public OnlCgformEnhanceJs queryEnhance(String code,String type);
	/**
	 * 保存JS增强
	 * @param onlCgformEnhanceJs
	 */
	public void saveEnhance(OnlCgformEnhanceJs onlCgformEnhanceJs);
	/**
	 * 编辑JS增强
	 * @param onlCgformEnhanceJs
	 */
	public void editEnhance(OnlCgformEnhanceJs onlCgformEnhanceJs);
	
	/**
	 * 根据主表ID和按钮编码查询实体
	 * @param formId OnlCgformHead的id
	 * @param buttonCode 按钮编码
	 * @return
	 */
	public OnlCgformEnhanceSql queryEnhanceSql(String formId,String buttonCode);
	/**
	 * 保存SQL增强
	 * @param onlCgformEnhanceSql
	 */
	public void saveEnhance(OnlCgformEnhanceSql onlCgformEnhanceSql);
	/**
	 * 编辑SQL增强
	 * @param onlCgformEnhanceSql
	 */
	public void editEnhance(OnlCgformEnhanceSql onlCgformEnhanceSql);
	
	/**
	 * 查询java增强信息
	 */
	public OnlCgformEnhanceJava queryEnhanceJava(OnlCgformEnhanceJava onlCgformEnhanceJava);
	/**
	 * 校验java增强配置是否唯一
	 */
	public boolean checkOnlyEnhance(OnlCgformEnhanceJava onlCgformEnhanceJava);
	/**
	 * 保存java增强
	 */
	public void saveEnhance(OnlCgformEnhanceJava onlCgformEnhanceJava);
	/**
	 * 编辑java增强
	 */
	public void editEnhance(OnlCgformEnhanceJava onlCgformEnhanceJava);
	
	/**
	 * 查询自定义按钮集合
	 * @param code 主表ID
	 * @param isListButton 是否是list按钮,true是 false否表示查询form页面的按钮
	 * @return
	 */
	public List<OnlCgformButton> queryButtonList(String code,boolean isListButton);
	
	/**
	 * 查询所有自定义按钮
	 * @param code
	 * @return
	 */
	public List<OnlCgformButton> queryButtonList(String code);
	
	/**
	 * 查询online所有的配置表名集合
	 * @return
	 */
	public List<String> queryOnlinetables();
	
	/**
	 * 将数据库表信息保存到online表中
	 * @param tbname
	 */
	public void saveDbTable2Online(String tbname);
	
	/**
	 * 根据OnlCgformHead组装表单所需的JsonSchema
	 * 这个json结构不同于上述
	 * @param head
	 * @return
	 */
	public JSONObject queryFormItem(OnlCgformHead head); 
	
	
	/**
	 * 保存online表单
	 */
	public void saveManyFormData(String code,JSONObject json,String xAccessToken) throws DBException, BusinessException;
	
	/**
	  * 查询online 表单
	 * @param code
	 * @param id
	 * @throws DBException
	 */
	public Map<String, Object> queryManyFormData(String code,String id)throws DBException;
	
	
	/**
	 * 查询多条子表数据
	 */
	public List<Map<String, Object>> queryManySubFormData(String table,String mainId)throws DBException;
	
	/**
	 * 查询子表数据
	 */
	public Map<String, Object> querySubFormData(String table,String mainId)throws DBException;
	
	
	/**
	  * 编辑表单数据
	 * @param code
	 * @param json
	 * @throws DBException
	 */
	public void editManyFormData(String code,JSONObject json) throws DBException, BusinessException ;

	/**
	 * 执行JAVA增强
	 * 导入时 返回值有用,返回
	 * 0则丢弃此数据，
	 * 1则新增数据(默认1) ，
	 * 2则修改此数据 注意：如果返回2 则需要往json中写入主键ID值
	 * @param buttonCode 按钮编码
	 * @param eventType 事件类型 start/end
	 * @param head 主表实体
	 * @param json 表单数据json
	 */
	public int executeEnhanceJava(String buttonCode, String eventType,OnlCgformHead head,JSONObject json) throws BusinessException;

	/**
	 * 导出增强
	 * @param head
	 * @param dataList
	 * @throws BusinessException
	 */
	public void executeEnhanceExport(OnlCgformHead head,List<Map<String,Object>> dataList) throws BusinessException;


	/**
	 * 针对集合数据做的java增强
	 * @param head
	 * @param dataList
	 * @throws BusinessException
	 */
	public void executeEnhanceList(OnlCgformHead head,String buttonCode,List<Map<String,Object>> dataList) throws BusinessException;
	
	/**
	 * 执行SQL增强 
	 * @param buttonCode
	 * @param formId
	 * @param json
	 */
	public void executeEnhanceSql(String buttonCode,String formId,JSONObject json);
	
	/**
	 * 执行自定义按钮逻辑
	 * @param buttonCode
	 * @param formId
	 * @param dataId
	 */
	public void executeCustomerButton(String buttonCode,String formId,String dataId)  throws BusinessException;
	
	/**
	 * 查询自定义按钮集合
	 * @param headId
	 * @return
	 */
	public List<OnlCgformButton> queryValidButtonList(String headId);
	
	/**
	  * 查询增强JS
	 * @param formId 配置表ID
	 * @param cgJsType list/form
	 * @return
	 */
	public OnlCgformEnhanceJs queryEnhanceJs(String formId,String cgJsType);
	
	/**
	 * 删除表的一条数据
	 * @param formId 表配置ID
	 * @param dataId 表数据ID
	 */
	public void deleteOneTableInfo(String formId,String dataId) throws BusinessException;
	
	/**
	 * 代码生成（单表）
	 * @throws Exception 
	 */
	public List<String> generateCode(OnlGenerateModel model) throws Exception;
	
	/**
	 * 代码生成（一对多）
	 * @throws Exception 
	 */
	public List<String> generateOneToMany(OnlGenerateModel model) throws Exception;
	
	/**
	 * 根据表名和表数据JSON保存表单数据
	 * @param tbname
	 * @param json
	 */
	public void addCrazyFormData(String tbname,JSONObject json) throws DBException, UnsupportedEncodingException ;
	
	/**
	 * 根据表名和表数据JSON修改表单数据
	 * @param tbname
	 * @param json
	 */
	public void editCrazyFormData(String tbname,JSONObject json) throws DBException, UnsupportedEncodingException ;
	
	/**
	 * 根据原始表ID 获取复制表的最大版本号
	 * @param physicId
	 * @return
	 */
	public Integer getMaxCopyVersion(String physicId);
	
	/**
	 * 复制表单
	 * @param physicId
	 * @throws Exception
	 */
	public void copyOnlineTableConfig(OnlCgformHead physicTable) throws Exception;
	
	/**
	 * 设置hascopy的状态值
	 * @param headList
	 */
	public void initCopyState(List<OnlCgformHead> headList);

	/**
	 * 批量删除
	 * @param ids
	 * @param flag
	 */
	public void deleteBatch(String ids,String flag);

	/**
	 * 树形数据 删除节点 需要判断父级节点状态
	 * @param head
	 * @param dataId
	 */
	public void updateParentNode(OnlCgformHead head,String dataId);
}
